Remove Django-Q & Opt Codes

Brightcells 7 years ago
parent
commit
f18bcdb061
8 changed files with 726 additions and 722 deletions
  1. 2 3
      api/urls.py
  2. 710 0
      group/group_views.py
  3. 3 706
      group/views.py
  4. 1 1
      pai2/settings.py
  5. 1 2
      pai2/urls.py
  6. 1 1
      photo/admin.py
  7. 8 8
      photo/views.py
  8. 0 1
      requirements.txt

+ 2 - 3
api/urls.py

@@ -2,13 +2,12 @@
2 2
 
3 3
 from django.conf.urls import url
4 4
 
5
-from account import views as account_views
6 5
 from account import tourguide_views
6
+from account import views as account_views
7 7
 from api import encrypt_views, mch_views
8 8
 from box import views as box_views
9 9
 from geo import views as geo_views
10
-from group import views as group_views
11
-from group import (groupuser_views, lensman_views, tourguidegroup_views, tourguidegroupadmin_views,
10
+from group import (group_views, groupuser_views, lensman_views, tourguidegroup_views, tourguidegroupadmin_views,
12 11
                    tourguidegroupuser_views)
13 12
 from message import views as message_views
14 13
 from miniapp import views as mini_views

+ 710 - 0
group/group_views.py

@@ -0,0 +1,710 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+from curtail_uuid import CurtailUUID
6
+from django.conf import settings
7
+from django.db import connection, transaction
8
+from django_response import response
9
+from logit import logit
10
+from paginator import pagination
11
+from rest_framework import viewsets
12
+from TimeConvert import TimeConvert as tc
13
+
14
+from account.models import UserInfo
15
+from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo, PhotoCommentInfo, PhotoThumbUpInfo
16
+from group.serializers import GroupInfoSerializer, GroupPhotoInfoSerializer, GroupUserInfoSerializer
17
+from message.models import UserMessageInfo
18
+from utils.error.errno_utils import GroupPhotoStatusCode, GroupStatusCode, GroupUserStatusCode, UserStatusCode
19
+from utils.group_photo_utils import get_current_photos
20
+from utils.price_utils import get_group_photo_price
21
+from utils.qiniucdn import qiniu_file_url
22
+from utils.redis.connect import r
23
+from utils.redis.rgroup import (del_group_photo_thumbup_flag, get_group_info, get_group_photo_comment_list,
24
+                                get_group_photo_data, get_group_photo_thumbup_flag, get_group_photo_thumbup_list,
25
+                                get_group_photo_watchers, get_group_users_info, set_group_info, set_group_info_by_id,
26
+                                set_group_photo_comment_list, set_group_photo_data, set_group_photo_thumbup_flag,
27
+                                set_group_photo_thumbup_list, set_group_users_info)
28
+from utils.redis.rkeys import GROUP_LAST_PHOTO_PK, GROUP_PHOTO_WATCHER_SET, GROUP_USERS_PASSED_SET
29
+from utils.redis.rlock import upload_lock
30
+from utils.redis.rorder import get_lensman_order_record
31
+from utils.sql.raw import PAI2_HOME_API, PAI2_HOME_WX_API
32
+from utils.storage_qiniu_utils import file_save
33
+from utils.time_utils import origin_expired_stamps
34
+from utils.url_utils import share_url
35
+
36
+
37
+@logit
38
+@transaction.atomic
39
+def group_create_api(request):
40
+    """ 群组创建 """
41
+    user_id = request.POST.get('user_id', '')
42
+    group_name = request.POST.get('group_name', '')
43
+    group_default_avatar = int(request.POST.get('group_default_avatar', 0))
44
+
45
+    # 用户校验
46
+    try:
47
+        user = UserInfo.objects.get(user_id=user_id)
48
+    except UserInfo.DoesNotExist:
49
+        return response(UserStatusCode.USER_NOT_FOUND)
50
+
51
+    # 群组唯一标识
52
+    group_id = CurtailUUID.uuid(GroupInfo, 'group_id')
53
+
54
+    # 群组记录创建
55
+    group = GroupInfo.objects.create(
56
+        group_id=group_id,
57
+        admin_id=user_id,
58
+        group_name=group_name,
59
+        group_default_avatar=group_default_avatar,
60
+        group_from=GroupInfo.APP_GROUP,
61
+    )
62
+
63
+    # Redis 群组数据缓存
64
+    group_info = set_group_info(group)
65
+
66
+    # 群组用户记录创建
67
+    GroupUserInfo.objects.create(
68
+        group_id=group_id,
69
+        user_id=user_id,
70
+        nickname=user.final_nickname,
71
+        avatar=user.avatar,
72
+        admin=True,
73
+        user_status=GroupUserInfo.PASSED,
74
+        passed_at=tc.utc_datetime(),
75
+    )
76
+
77
+    # Redis 群组用户数据缓存
78
+    group_users = set_group_users_info(group)
79
+
80
+    # Redis 群组通过集合缓存
81
+    r.sadd(GROUP_USERS_PASSED_SET % group_id, user_id)
82
+
83
+    return response(200, 'Create Group Success', u'群组创建成功', {
84
+        'group_id': group_id,
85
+        'group': group_info,
86
+        'users': group_users,
87
+    })
88
+
89
+
90
+@logit
91
+def group_detail_api(request):
92
+    """ 群组详情 """
93
+    group_id = request.POST.get('group_id', '')
94
+    user_id = request.POST.get('user_id', '')
95
+
96
+    return response(200, 'Get Group Detail Info Success', u'获取群组详情成功', {
97
+        'group_id': group_id,
98
+        'group': get_group_info(group_id),
99
+        'users': get_group_users_info(group_id, user_id),
100
+    })
101
+
102
+
103
+@logit
104
+def group_update_api(request):
105
+    """ 群组更新 """
106
+    group_id = request.POST.get('group_id', '')
107
+    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
108
+    group_name = request.POST.get('group_name', '')
109
+    group_desc = request.POST.get('group_desc', '')
110
+
111
+    group_avatar = request.FILES.get('group_avatar', '')
112
+
113
+    # 群组校验
114
+    try:
115
+        group = GroupInfo.objects.get(group_id=group_id)
116
+    except GroupInfo.DoesNotExist:
117
+        return response(GroupStatusCode.GROUP_NOT_FOUND)
118
+
119
+    # 权限校验
120
+    if group.admin_id != admin_id:
121
+        return response(GroupStatusCode.NOT_GROUP_ADMIN)
122
+
123
+    # 群组名称更新
124
+    if group_name:
125
+        group.group_name = group_name
126
+    # 群组描述更新
127
+    if group_desc:
128
+        group.group_desc = group_desc
129
+    # 群组头像更新
130
+    if group_avatar:
131
+        group.group_avatar = file_save(group_avatar, prefix='group', ext='.jpeg').photo_path
132
+    group.save()
133
+
134
+    # Redis 群组数据缓存更新
135
+    group_info = set_group_info(group)
136
+
137
+    return response(200, 'Update Group Success', u'群组更新成功', {
138
+        'group_id': group_id,
139
+        'group': group_info,
140
+        'users': get_group_users_info(group_id, admin_id),
141
+    })
142
+
143
+
144
+@logit
145
+def group_delete_api(request):
146
+    """ 群组删除 """
147
+    group_id = request.POST.get('group_id', '')
148
+    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
149
+
150
+    # 群组校验
151
+    try:
152
+        group = GroupInfo.objects.get(group_id=group_id)
153
+    except GroupInfo.DoesNotExist:
154
+        return response(GroupStatusCode.GROUP_NOT_FOUND)
155
+
156
+    # 权限校验
157
+    if group.admin_id != admin_id:
158
+        return response(GroupStatusCode.NOT_GROUP_ADMIN)
159
+
160
+    # 照片数量校验
161
+    if GroupPhotoInfo.objects.filter(group_id=group_id, status=True).count():
162
+        return response(GroupStatusCode.GROUP_PHOTO_NOT_EMPTY)
163
+
164
+    # 删除群组
165
+    group.status = False
166
+    group.save()
167
+
168
+    # 删除群组用户
169
+    GroupUserInfo.objects.filter(group_id=group_id).update(status=False)
170
+
171
+    return response(200, 'Delete Group Success', u'群组删除成功')
172
+
173
+
174
+@logit
175
+def group_list_api(request):
176
+    """ 群组列表 """
177
+    user_id = request.POST.get('user_id', '')
178
+    page = int(request.POST.get('page', 1))
179
+    num = int(request.POST.get('num', settings.GROUP_NUM_PER_PAGE))
180
+
181
+    group_users = GroupUserInfo.objects.filter(user_id=user_id, user_status=GroupUserInfo.PASSED, status=True).order_by('-pk')
182
+    group_users, left = pagination(group_users, page, num)
183
+
184
+    groups = []
185
+    for group_user in group_users:
186
+        group_info = get_group_info(group_user.group_id)
187
+        groups.append(group_info) if group_info else None
188
+
189
+    return response(200, 'Get Group List Success', u'获取群组列表成功', {
190
+        'groups': groups,
191
+        'left': left,
192
+    })
193
+
194
+
195
+@logit
196
+def group_lock_api(request):
197
+    """ 群组锁定 """
198
+    group_id = request.POST.get('group_id', '')
199
+    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
200
+
201
+    # 群组校验
202
+    try:
203
+        group = GroupInfo.objects.get(group_id=group_id)
204
+    except GroupInfo.DoesNotExist:
205
+        return response(GroupStatusCode.GROUP_NOT_FOUND)
206
+
207
+    # 权限校验
208
+    if group.admin_id != admin_id:
209
+        return response(GroupStatusCode.NOT_GROUP_ADMIN)
210
+
211
+    # 群组锁定
212
+    group.group_lock = True
213
+    group.save()
214
+
215
+    # Redis 群组数据缓存更新
216
+    set_group_info(group)
217
+
218
+    return response(200, 'Lock Success', u'锁定成功')
219
+
220
+
221
+@logit
222
+def group_unlock_api(request):
223
+    """ 群组解锁 """
224
+    group_id = request.POST.get('group_id', '')
225
+    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
226
+
227
+    # 群组校验
228
+    try:
229
+        group = GroupInfo.objects.get(group_id=group_id)
230
+    except GroupInfo.DoesNotExist:
231
+        return response(GroupStatusCode.GROUP_NOT_FOUND)
232
+
233
+    # 权限校验
234
+    if group.admin_id != admin_id:
235
+        return response(GroupStatusCode.NOT_GROUP_ADMIN)
236
+
237
+    # 群组解锁
238
+    group.group_lock = False
239
+    group.save()
240
+
241
+    # Redis 群组数据缓存更新
242
+    set_group_info(group)
243
+
244
+    return response(200, 'Unlock Success', u'解锁成功')
245
+
246
+
247
+@logit
248
+def group_data_api(request):
249
+    """ 群组数据,评论数,点赞数 """
250
+    group_id = request.POST.get('group_id', '')
251
+
252
+    return response(200, 'Get Group Data Success', u'获取群组数据成功', {
253
+        'photo_datas': get_group_photo_data(group_id),
254
+    })
255
+
256
+
257
+@logit(body=settings.LOGIT_BODY_FLAG, res=settings.LOGIT_RES_FLAG)
258
+def flyimg_upload_api(request):
259
+    """ 飞图上传 """
260
+    group_id = request.POST.get('group_id', '')
261
+    user_id = request.POST.get('user_id', '')
262
+    nickname = request.POST.get('nickname', '')
263
+
264
+    photo = request.FILES.get('photo', '')
265
+
266
+    current_id = int(request.POST.get('current_id', -1))
267
+
268
+    # 用户校验
269
+    try:
270
+        user = UserInfo.objects.get(user_id=user_id)
271
+    except UserInfo.DoesNotExist:
272
+        return response(UserStatusCode.USER_NOT_FOUND)
273
+
274
+    # 群组用户校验
275
+    try:
276
+        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
277
+    except GroupUserInfo.DoesNotExist:
278
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
279
+
280
+    if photo and upload_lock(group_id, user_id, photo):
281
+        photo_info = file_save(photo, prefix='fly', ext='.jpeg', thumbnail=True)
282
+
283
+        # 群组照片记录创建
284
+        group_photo, created = GroupPhotoInfo.objects.get_or_create(
285
+            group_id=group_id,
286
+            user_id=user_id,
287
+            photo_md5=photo_info.photo_md5,
288
+            defaults={
289
+                'nickname': nickname or user.final_nickname,
290
+                'avatar': user.avatar,
291
+                'photo_path': photo_info.photo_path,
292
+                'has_watermark': False,
293
+                'photo_w': photo_info.photo_w,
294
+                'photo_h': photo_info.photo_h,
295
+                'photo_thumbnail_path': photo_info.photo_thumbnail_path,
296
+                'photo_thumbnail_w': photo_info.photo_thumbnail_w,
297
+                'photo_thumbnail_h': photo_info.photo_thumbnail_h,
298
+                'photo_thumbnail2_path': photo_info.photo_thumbnail2_path,
299
+                'photo_thumbnail2_w': photo_info.photo_thumbnail2_w,
300
+                'photo_thumbnail2_h': photo_info.photo_thumbnail2_h,
301
+            }
302
+        )
303
+
304
+        if created:
305
+            # 设置群组最后一张照片PK
306
+            r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)
307
+
308
+            # Redis 群组数据缓存
309
+            set_group_info_by_id(group_id)
310
+
311
+    curinfo = get_current_photos(group_id, user_id, max(current_id, group_user.current_id), request=request)
312
+
313
+    return response(200, 'Flyimg Upload Success', u'飞图上传成功', curinfo)
314
+
315
+
316
+@logit
317
+def flyimg_list_api(request):
318
+    """ 飞图列表 """
319
+    group_id = request.POST.get('group_id', '')
320
+    user_id = request.POST.get('user_id', '')
321
+    current_id = int(request.POST.get('current_id', -1))
322
+
323
+    # 群组用户校验
324
+    try:
325
+        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
326
+    except GroupUserInfo.DoesNotExist:
327
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
328
+
329
+    curinfo = get_current_photos(group_id, user_id, max(current_id, group_user.current_id), request=request)
330
+
331
+    return response(200, 'Get Flyimg List Success', u'获取飞图上传成功', curinfo)
332
+
333
+
334
+@logit
335
+def flyimg_detail_api(request):
336
+    user_id = request.POST.get('user_id', '')
337
+    photo_id = request.POST.get('photo_id', '')
338
+
339
+    # 群组照片校验
340
+    try:
341
+        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
342
+    except GroupPhotoInfo.DoesNotExist:
343
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
344
+
345
+    return response(200, 'Get Flyimg Detail Success', u'获取飞图详情成功', {
346
+        'photo_info': group_photo.photo_info(user_id),
347
+        'comments': get_group_photo_comment_list(photo_id),
348
+        'thumbup': get_group_photo_thumbup_flag(photo_id, user_id),  # user_id 是否点赞 photo_id
349
+        'thumbups': get_group_photo_thumbup_list(photo_id),  # 群组照片点赞列表
350
+    })
351
+
352
+
353
+@logit
354
+def comment_submit_api(request):
355
+    """ 飞图评论提交 """
356
+    group_id = request.POST.get('group_id', '')
357
+    user_id = request.POST.get('user_id', '')
358
+    to_uid = request.POST.get('to_uid', '')
359
+    photo_id = request.POST.get('photo_id', '')
360
+    comment = request.POST.get('comment', '')
361
+
362
+    # 群组用户校验
363
+    try:
364
+        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
365
+    except GroupUserInfo.DoesNotExist:
366
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
367
+
368
+    # 群组照片校验
369
+    try:
370
+        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
371
+    except GroupPhotoInfo.DoesNotExist:
372
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
373
+
374
+    # 评论内容校验
375
+    if not comment:
376
+        return response(GroupPhotoStatusCode.COMMENT_CONTENT_EMPTY)
377
+
378
+    # 群组照片评论记录创建
379
+    PhotoCommentInfo.objects.create(
380
+        photo_id=photo_id,
381
+        user_id=user_id,
382
+        nickname=group_user.nickname,
383
+        avatar=group_user.avatar,
384
+        to_uid=to_uid,
385
+        comment=comment,
386
+    )
387
+
388
+    # 群组照片评论数更新
389
+    group_photo.comment_num += 1
390
+    group_photo.save()
391
+
392
+    # Redis 群组照片数据缓存
393
+    set_group_photo_data(group_id)
394
+
395
+    # Redis 群组照片评论列表缓存刷新
396
+    set_group_photo_comment_list(photo_id)
397
+
398
+    r.sadd(GROUP_PHOTO_WATCHER_SET % photo_id, user_id)
399
+
400
+    # 判断群组照片发布者是否已经被管理员移除/主动退出,如若移除/退出,则不给发布者提醒
401
+    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
402
+        UserMessageInfo.objects.create(
403
+            from_uid=user_id,
404
+            from_nickname=group_user.nickname,
405
+            from_avatar=group_user.avatar,
406
+            to_uid=group_photo.user_id,
407
+            group_id=group_photo.group_id,
408
+            photo_id=group_photo.photo_id,
409
+            msg_type=UserMessageInfo.COMMENT,
410
+            msg_title=u'评论',
411
+            msg_content=comment,
412
+        )
413
+
414
+    # 给所有关注者(评论/点赞)发送提醒,移除(评论/点赞)者和照片所有者
415
+    watchers = get_group_photo_watchers(photo_id, [user_id, group_photo.user_id])
416
+    for watcher in watchers:
417
+        UserMessageInfo.objects.create(
418
+            from_uid=user_id,
419
+            from_nickname=group_user.nickname,
420
+            from_avatar=group_user.avatar,
421
+            to_uid=watcher,
422
+            group_id=group_photo.group_id,
423
+            photo_id=group_photo.photo_id,
424
+            msg_type=UserMessageInfo.COMMENT,
425
+            msg_title=u'评论',
426
+            msg_content=comment,
427
+        )
428
+
429
+    return response(200, 'Comment Success', u'评论成功', {
430
+        'comments': get_group_photo_comment_list(photo_id),
431
+    })
432
+
433
+
434
+@logit
435
+def comment_list_api(request):
436
+    """ 飞图评论列表 """
437
+    photo_id = request.POST.get('photo_id', '')
438
+
439
+    # 群组照片校验
440
+    if not GroupPhotoInfo.objects.filter(photo_id=photo_id).exists():
441
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
442
+
443
+    return response(200, 'Get Comment List Success', u'获取评论列表成功', {
444
+        'comments': get_group_photo_comment_list(photo_id),
445
+    })
446
+
447
+
448
+@logit
449
+def thumbup_submit_api(request):
450
+    """ 飞图点赞提交 """
451
+    group_id = request.POST.get('group_id', '')
452
+    user_id = request.POST.get('user_id', '')
453
+    photo_id = request.POST.get('photo_id', '')
454
+
455
+    # 群组用户校验
456
+    try:
457
+        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
458
+    except GroupUserInfo.DoesNotExist:
459
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
460
+
461
+    # 群组照片校验
462
+    try:
463
+        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
464
+    except GroupPhotoInfo.DoesNotExist:
465
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
466
+
467
+    # user_id 是否点赞 photo_id
468
+    if get_group_photo_thumbup_flag(photo_id, user_id):
469
+        return response(GroupPhotoStatusCode.DUPLICATE_THUMB_UP)
470
+
471
+    # 群组照片点赞记录创建/更新
472
+    photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
473
+        photo_id=photo_id,
474
+        user_id=user_id,
475
+    )
476
+    photo_thumbup.nickname = group_user.nickname
477
+    photo_thumbup.avatar = group_user.avatar
478
+    photo_thumbup.thumbup = True
479
+    photo_thumbup.save()
480
+
481
+    # Redis 群组照片点赞数据缓存
482
+    set_group_photo_thumbup_flag(photo_id, user_id)
483
+
484
+    # 群组照片点赞数更新
485
+    group_photo.thumbup_num += 1
486
+    group_photo.save()
487
+
488
+    # Redis 群组照片数据缓存
489
+    set_group_photo_data(group_id)
490
+
491
+    # Redis 群组照片点赞列表缓存刷新
492
+    set_group_photo_thumbup_list(photo_id)
493
+
494
+    r.sadd(GROUP_PHOTO_WATCHER_SET % photo_id, user_id)
495
+
496
+    # 判断群组照片发布者是否已经被管理员移除/主动退出,如若移除/退出,则不给发布者提醒
497
+    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
498
+        UserMessageInfo.objects.create(
499
+            from_uid=user_id,
500
+            from_nickname=group_user.nickname,
501
+            from_avatar=group_user.avatar,
502
+            to_uid=group_photo.user_id,
503
+            group_id=group_photo.group_id,
504
+            photo_id=group_photo.photo_id,
505
+            msg_type=UserMessageInfo.THUMBUP,
506
+            msg_title=u'点赞',
507
+            msg_content=u'点赞',
508
+        )
509
+
510
+    # 给所有关注者(评论/点赞)发送提醒,移除(评论/点赞)者和照片所有者
511
+    watchers = get_group_photo_watchers(photo_id, [user_id, group_photo.user_id])
512
+    for watcher in watchers:
513
+        UserMessageInfo.objects.create(
514
+            from_uid=user_id,
515
+            from_nickname=group_user.nickname,
516
+            from_avatar=group_user.avatar,
517
+            to_uid=watcher,
518
+            group_id=group_photo.group_id,
519
+            photo_id=group_photo.photo_id,
520
+            msg_type=UserMessageInfo.THUMBUP,
521
+            msg_title=u'点赞',
522
+            msg_content=u'点赞',
523
+        )
524
+
525
+    return response(200, 'Thumbup Success', u'点赞提交成功', {
526
+        'thumbup': True,
527
+        'thumbups': get_group_photo_thumbup_list(photo_id),
528
+    })
529
+
530
+
531
+@logit
532
+def thumbup_list_api(request):
533
+    """ 飞图点赞列表 """
534
+    user_id = request.POST.get('user_id', '')
535
+    photo_id = request.POST.get('photo_id', '')
536
+
537
+    return response(200, 'Get Thumbup List Success', u'获取点赞列表成功', {
538
+        'thumbup': get_group_photo_thumbup_flag(photo_id, user_id),  # user_id 是否点赞 photo_id
539
+        'thumbups': get_group_photo_thumbup_list(photo_id),  # 群组照片点赞列表
540
+    })
541
+
542
+
543
+@logit
544
+def thumbup_cancel_api(request):
545
+    """ 飞图点赞取消 """
546
+    group_id = request.POST.get('group_id', '')
547
+    user_id = request.POST.get('user_id', '')
548
+    photo_id = request.POST.get('photo_id', '')
549
+
550
+    # 群组用户校验
551
+    try:
552
+        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
553
+    except GroupUserInfo.DoesNotExist:
554
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
555
+
556
+    # 群组照片校验
557
+    try:
558
+        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
559
+    except GroupPhotoInfo.DoesNotExist:
560
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
561
+
562
+    # user_id 是否点赞 photo_id
563
+    if not get_group_photo_thumbup_flag(photo_id, user_id):
564
+        return response(GroupPhotoStatusCode.THUMB_UP_NOT_FOUND)
565
+
566
+    # 群组照片点赞取消
567
+    photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
568
+        photo_id=photo_id,
569
+        user_id=user_id,
570
+    )
571
+    photo_thumbup.thumbup = False
572
+    photo_thumbup.save()
573
+
574
+    # Redis 群组照片点赞数据移除
575
+    del_group_photo_thumbup_flag(photo_id, user_id)
576
+
577
+    # 群组照片点赞数更新
578
+    group_photo.thumbup_num -= 1
579
+    group_photo.save()
580
+
581
+    # Redis 群组照片数据缓存
582
+    set_group_photo_data(group_id)
583
+
584
+    # Redis 群组照片点赞列表缓存刷新
585
+    set_group_photo_thumbup_list(photo_id)
586
+
587
+    # 判断群组照片发布者是否已经被管理员移除/主动退出,如若移除/退出,则不给发布者提醒
588
+    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
589
+        UserMessageInfo.objects.create(
590
+            from_uid=user_id,
591
+            from_nickname=group_user.nickname,
592
+            from_avatar=group_user.avatar,
593
+            to_uid=group_photo.user_id,
594
+            group_id=group_photo.group_id,
595
+            photo_id=group_photo.photo_id,
596
+            msg_type=UserMessageInfo.THUMBUP,
597
+            msg_title=u'取消点赞',
598
+            msg_content=u'取消点赞',
599
+        )
600
+
601
+    # 群组照片点赞列表
602
+    photo_thumbups = PhotoThumbUpInfo.objects.filter(photo_id=photo_id, thumbup=True, status=True)
603
+
604
+    return response(200, 'Thumbup Cancel Success', u'点赞取消成功', {
605
+        'thumbup': False,
606
+        'thumbups': [thumbup.thumbup_info for thumbup in photo_thumbups],
607
+    })
608
+
609
+
610
+@logit
611
+def pai2_home_api(request):
612
+    """ 首页照片信息 """
613
+    user_id = request.POST.get('user_id', '')
614
+    page = int(request.POST.get('page', 1))
615
+    num = int(request.POST.get('num', settings.PAI2_HOME_PER_PAGE))
616
+
617
+    # 执行原生 SQL 语句,获取首页照片列表
618
+    cursor = connection.cursor()
619
+    cursor.execute((PAI2_HOME_WX_API if request.weixin else PAI2_HOME_API).format(
620
+        user_id=user_id,
621
+        offset=0,
622
+        rows=settings.PAI2_HOME_MAX_ROWS,
623
+    ))
624
+    rows = cursor.fetchall()
625
+
626
+    # 首页照片分页
627
+    rows, left = pagination(rows, page, num)
628
+
629
+    # 首页照片信息
630
+    rows = [{
631
+        'group_id': row[0],
632
+        'group_name': row[1],
633
+        'group_default_avatar': row[2],
634
+        'group_avatar': row[3],
635
+        'group_from': row[4],
636
+        'photo_id': row[5],
637
+        'photo_url': qiniu_file_url(row[6], bucket='watermark' if row[7] else 'photo'),
638
+        'photo_w': row[8],
639
+        'photo_h': row[9],
640
+        'photo_thumbnail_url': qiniu_file_url(row[10], bucket='thumbnail'),
641
+        'photo_thumbnail_w': row[11],
642
+        'photo_thumbnail_h': row[12],
643
+        'photo_thumbnail2_url': qiniu_file_url(row[13], bucket='thumbnail2'),
644
+        'photo_thumbnail2_w': row[14],
645
+        'photo_thumbnail2_h': row[15],
646
+        'photo_share_url': share_url(row[5]),  # Warning: Index of This Line is 5
647
+        'user_id': row[16],
648
+        'nickname': row[17],
649
+        'avatar': row[18],
650
+        'comment_num': row[19],
651
+        'thumbup_num': row[20],
652
+        'photo_from': row[21],
653
+        'session_id': row[22],
654
+        'nomark': row[23],
655
+        'origin': row[24],
656
+        'created_at': row[25],
657
+        'origin_expired_stamps': origin_expired_stamps(row[25], row[16]),
658
+        'thumbup': get_group_photo_thumbup_flag(row[5], user_id),
659
+        'porder': get_lensman_order_record(row[5], user_id) if row[21] == GroupPhotoInfo.SESSION_GROUP else {},
660
+        'display_payment_btn': row[21] == GroupPhotoInfo.SESSION_GROUP and row[26] not in [GroupPhotoInfo.OUTTAKE],
661
+    } for row in rows]
662
+
663
+    return response(200, 'Get Home Data Success', u'获取首页数据成功', {
664
+        'photos': rows,
665
+        'left': left,
666
+    })
667
+
668
+
669
+@logit
670
+def lensman_photo_price(request):
671
+    """ 摄影师照片价格获取 """
672
+    user_id = request.POST.get('user_id', '')
673
+    photo_id = request.POST.get('photo_id', '')
674
+    photo_type = request.POST.get('photo_type', 'nomark')  # nomark for 去除水印, origin for 获取高清图
675
+
676
+    # 群组照片校验
677
+    try:
678
+        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
679
+    except GroupPhotoInfo.DoesNotExist:
680
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
681
+
682
+    return response(200, 'Get Price Success', u'获取价格成功', {
683
+        'price': get_group_photo_price(group_photo, photo_type)
684
+    })
685
+
686
+
687
+@logit
688
+def lensman_photo_bought(request):
689
+    """ 摄影师照片已购买 """
690
+    user_id = request.POST.get('user_id', '')
691
+    photo_id = request.POST.get('photo_id', '')
692
+
693
+    return response(200, 'Get Bought Data Success', u'获取购买数据成功', {
694
+        'porder': get_lensman_order_record(photo_id, user_id)
695
+    })
696
+
697
+
698
+class GroupInfoViewSet(viewsets.ModelViewSet):
699
+    queryset = GroupInfo.objects.all().order_by('-pk')
700
+    serializer_class = GroupInfoSerializer
701
+
702
+
703
+class GroupUserInfoViewSet(viewsets.ModelViewSet):
704
+    queryset = GroupUserInfo.objects.all().order_by('-pk')
705
+    serializer_class = GroupUserInfoSerializer
706
+
707
+
708
+class GroupPhotoInfoViewSet(viewsets.ModelViewSet):
709
+    queryset = GroupPhotoInfo.objects.all().order_by('-pk')
710
+    serializer_class = GroupPhotoInfoSerializer

+ 3 - 706
group/views.py

@@ -1,710 +1,7 @@
1 1
 # -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
2 3
 
3
-from __future__ import division
4
+from django.shortcuts import render
4 5
 
5
-from curtail_uuid import CurtailUUID
6
-from django.conf import settings
7
-from django.db import connection, transaction
8
-from django_response import response
9
-from logit import logit
10
-from paginator import pagination
11
-from rest_framework import viewsets
12
-from TimeConvert import TimeConvert as tc
13 6
 
14
-from account.models import UserInfo
15
-from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo, PhotoCommentInfo, PhotoThumbUpInfo
16
-from group.serializers import GroupInfoSerializer, GroupPhotoInfoSerializer, GroupUserInfoSerializer
17
-from message.models import UserMessageInfo
18
-from utils.error.errno_utils import GroupPhotoStatusCode, GroupStatusCode, GroupUserStatusCode, UserStatusCode
19
-from utils.group_photo_utils import get_current_photos
20
-from utils.price_utils import get_group_photo_price
21
-from utils.qiniucdn import qiniu_file_url
22
-from utils.redis.connect import r
23
-from utils.redis.rgroup import (del_group_photo_thumbup_flag, get_group_info, get_group_photo_comment_list,
24
-                                get_group_photo_data, get_group_photo_thumbup_flag, get_group_photo_thumbup_list,
25
-                                get_group_photo_watchers, get_group_users_info, set_group_info, set_group_info_by_id,
26
-                                set_group_photo_comment_list, set_group_photo_data, set_group_photo_thumbup_flag,
27
-                                set_group_photo_thumbup_list, set_group_users_info)
28
-from utils.redis.rkeys import GROUP_LAST_PHOTO_PK, GROUP_PHOTO_WATCHER_SET, GROUP_USERS_PASSED_SET
29
-from utils.redis.rlock import upload_lock
30
-from utils.redis.rorder import get_lensman_order_record
31
-from utils.sql.raw import PAI2_HOME_API, PAI2_HOME_WX_API
32
-from utils.storage_qiniu_utils import file_save
33
-from utils.time_utils import origin_expired_stamps
34
-from utils.url_utils import share_url
35
-
36
-
37
-@logit
38
-@transaction.atomic
39
-def group_create_api(request):
40
-    """ 群组创建 """
41
-    user_id = request.POST.get('user_id', '')
42
-    group_name = request.POST.get('group_name', '')
43
-    group_default_avatar = int(request.POST.get('group_default_avatar', 0))
44
-
45
-    # 用户校验
46
-    try:
47
-        user = UserInfo.objects.get(user_id=user_id)
48
-    except UserInfo.DoesNotExist:
49
-        return response(UserStatusCode.USER_NOT_FOUND)
50
-
51
-    # 群组唯一标识
52
-    group_id = CurtailUUID.uuid(GroupInfo, 'group_id')
53
-
54
-    # 群组记录创建
55
-    group = GroupInfo.objects.create(
56
-        group_id=group_id,
57
-        admin_id=user_id,
58
-        group_name=group_name,
59
-        group_default_avatar=group_default_avatar,
60
-        group_from=GroupInfo.APP_GROUP,
61
-    )
62
-
63
-    # Redis 群组数据缓存
64
-    group_info = set_group_info(group)
65
-
66
-    # 群组用户记录创建
67
-    GroupUserInfo.objects.create(
68
-        group_id=group_id,
69
-        user_id=user_id,
70
-        nickname=user.final_nickname,
71
-        avatar=user.avatar,
72
-        admin=True,
73
-        user_status=GroupUserInfo.PASSED,
74
-        passed_at=tc.utc_datetime(),
75
-    )
76
-
77
-    # Redis 群组用户数据缓存
78
-    group_users = set_group_users_info(group)
79
-
80
-    # Redis 群组通过集合缓存
81
-    r.sadd(GROUP_USERS_PASSED_SET % group_id, user_id)
82
-
83
-    return response(200, 'Create Group Success', u'群组创建成功', {
84
-        'group_id': group_id,
85
-        'group': group_info,
86
-        'users': group_users,
87
-    })
88
-
89
-
90
-@logit
91
-def group_detail_api(request):
92
-    """ 群组详情 """
93
-    group_id = request.POST.get('group_id', '')
94
-    user_id = request.POST.get('user_id', '')
95
-
96
-    return response(200, 'Get Group Detail Info Success', u'获取群组详情成功', {
97
-        'group_id': group_id,
98
-        'group': get_group_info(group_id),
99
-        'users': get_group_users_info(group_id, user_id),
100
-    })
101
-
102
-
103
-@logit
104
-def group_update_api(request):
105
-    """ 群组更新 """
106
-    group_id = request.POST.get('group_id', '')
107
-    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
108
-    group_name = request.POST.get('group_name', '')
109
-    group_desc = request.POST.get('group_desc', '')
110
-
111
-    group_avatar = request.FILES.get('group_avatar', '')
112
-
113
-    # 群组校验
114
-    try:
115
-        group = GroupInfo.objects.get(group_id=group_id)
116
-    except GroupInfo.DoesNotExist:
117
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
118
-
119
-    # 权限校验
120
-    if group.admin_id != admin_id:
121
-        return response(GroupStatusCode.NOT_GROUP_ADMIN)
122
-
123
-    # 群组名称更新
124
-    if group_name:
125
-        group.group_name = group_name
126
-    # 群组描述更新
127
-    if group_desc:
128
-        group.group_desc = group_desc
129
-    # 群组头像更新
130
-    if group_avatar:
131
-        group.group_avatar = file_save(group_avatar, prefix='group', ext='.jpeg').photo_path
132
-    group.save()
133
-
134
-    # Redis 群组数据缓存更新
135
-    group_info = set_group_info(group)
136
-
137
-    return response(200, 'Update Group Success', u'群组更新成功', {
138
-        'group_id': group_id,
139
-        'group': group_info,
140
-        'users': get_group_users_info(group_id, admin_id),
141
-    })
142
-
143
-
144
-@logit
145
-def group_delete_api(request):
146
-    """ 群组删除 """
147
-    group_id = request.POST.get('group_id', '')
148
-    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
149
-
150
-    # 群组校验
151
-    try:
152
-        group = GroupInfo.objects.get(group_id=group_id)
153
-    except GroupInfo.DoesNotExist:
154
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
155
-
156
-    # 权限校验
157
-    if group.admin_id != admin_id:
158
-        return response(GroupStatusCode.NOT_GROUP_ADMIN)
159
-
160
-    # 照片数量校验
161
-    if GroupPhotoInfo.objects.filter(group_id=group_id, status=True).count():
162
-        return response(GroupStatusCode.GROUP_PHOTO_NOT_EMPTY)
163
-
164
-    # 删除群组
165
-    group.status = False
166
-    group.save()
167
-
168
-    # 删除群组用户
169
-    GroupUserInfo.objects.filter(group_id=group_id).update(status=False)
170
-
171
-    return response(200, 'Delete Group Success', u'群组删除成功')
172
-
173
-
174
-@logit
175
-def group_list_api(request):
176
-    """ 群组列表 """
177
-    user_id = request.POST.get('user_id', '')
178
-    page = int(request.POST.get('page', 1))
179
-    num = int(request.POST.get('num', settings.GROUP_NUM_PER_PAGE))
180
-
181
-    group_users = GroupUserInfo.objects.filter(user_id=user_id, user_status=GroupUserInfo.PASSED, status=True).order_by('-pk')
182
-    group_users, left = pagination(group_users, page, num)
183
-
184
-    groups = []
185
-    for group_user in group_users:
186
-        group_info = get_group_info(group_user.group_id)
187
-        groups.append(group_info) if group_info else None
188
-
189
-    return response(200, 'Get Group List Success', u'获取群组列表成功', {
190
-        'groups': groups,
191
-        'left': left,
192
-    })
193
-
194
-
195
-@logit
196
-def group_lock_api(request):
197
-    """ 群组锁定 """
198
-    group_id = request.POST.get('group_id', '')
199
-    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
200
-
201
-    # 群组校验
202
-    try:
203
-        group = GroupInfo.objects.get(group_id=group_id)
204
-    except GroupInfo.DoesNotExist:
205
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
206
-
207
-    # 权限校验
208
-    if group.admin_id != admin_id:
209
-        return response(GroupStatusCode.NOT_GROUP_ADMIN)
210
-
211
-    # 群组锁定
212
-    group.group_lock = True
213
-    group.save()
214
-
215
-    # Redis 群组数据缓存更新
216
-    set_group_info(group)
217
-
218
-    return response(200, 'Lock Success', u'锁定成功')
219
-
220
-
221
-@logit
222
-def group_unlock_api(request):
223
-    """ 群组解锁 """
224
-    group_id = request.POST.get('group_id', '')
225
-    admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
226
-
227
-    # 群组校验
228
-    try:
229
-        group = GroupInfo.objects.get(group_id=group_id)
230
-    except GroupInfo.DoesNotExist:
231
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
232
-
233
-    # 权限校验
234
-    if group.admin_id != admin_id:
235
-        return response(GroupStatusCode.NOT_GROUP_ADMIN)
236
-
237
-    # 群组解锁
238
-    group.group_lock = False
239
-    group.save()
240
-
241
-    # Redis 群组数据缓存更新
242
-    set_group_info(group)
243
-
244
-    return response(200, 'Unlock Success', u'解锁成功')
245
-
246
-
247
-@logit
248
-def group_data_api(request):
249
-    """ 群组数据,评论数,点赞数 """
250
-    group_id = request.POST.get('group_id', '')
251
-
252
-    return response(200, 'Get Group Data Success', u'获取群组数据成功', {
253
-        'photo_datas': get_group_photo_data(group_id),
254
-    })
255
-
256
-
257
-@logit(body=settings.LOGIT_BODY_FLAG, res=settings.LOGIT_RES_FLAG)
258
-def flyimg_upload_api(request):
259
-    """ 飞图上传 """
260
-    group_id = request.POST.get('group_id', '')
261
-    user_id = request.POST.get('user_id', '')
262
-    nickname = request.POST.get('nickname', '')
263
-
264
-    photo = request.FILES.get('photo', '')
265
-
266
-    current_id = int(request.POST.get('current_id', -1))
267
-
268
-    # 用户校验
269
-    try:
270
-        user = UserInfo.objects.get(user_id=user_id)
271
-    except UserInfo.DoesNotExist:
272
-        return response(UserStatusCode.USER_NOT_FOUND)
273
-
274
-    # 群组用户校验
275
-    try:
276
-        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
277
-    except GroupUserInfo.DoesNotExist:
278
-        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
279
-
280
-    if photo and upload_lock(group_id, user_id, photo):
281
-        photo_info = file_save(photo, prefix='fly', ext='.jpeg', thumbnail=True)
282
-
283
-        # 群组照片记录创建
284
-        group_photo, created = GroupPhotoInfo.objects.get_or_create(
285
-            group_id=group_id,
286
-            user_id=user_id,
287
-            photo_md5=photo_info.photo_md5,
288
-            defaults={
289
-                'nickname': nickname or user.final_nickname,
290
-                'avatar': user.avatar,
291
-                'photo_path': photo_info.photo_path,
292
-                'has_watermark': False,
293
-                'photo_w': photo_info.photo_w,
294
-                'photo_h': photo_info.photo_h,
295
-                'photo_thumbnail_path': photo_info.photo_thumbnail_path,
296
-                'photo_thumbnail_w': photo_info.photo_thumbnail_w,
297
-                'photo_thumbnail_h': photo_info.photo_thumbnail_h,
298
-                'photo_thumbnail2_path': photo_info.photo_thumbnail2_path,
299
-                'photo_thumbnail2_w': photo_info.photo_thumbnail2_w,
300
-                'photo_thumbnail2_h': photo_info.photo_thumbnail2_h,
301
-            }
302
-        )
303
-
304
-        if created:
305
-            # 设置群组最后一张照片PK
306
-            r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)
307
-
308
-            # Redis 群组数据缓存
309
-            set_group_info_by_id(group_id)
310
-
311
-    curinfo = get_current_photos(group_id, user_id, max(current_id, group_user.current_id), request=request)
312
-
313
-    return response(200, 'Flyimg Upload Success', u'飞图上传成功', curinfo)
314
-
315
-
316
-@logit
317
-def flyimg_list_api(request):
318
-    """ 飞图列表 """
319
-    group_id = request.POST.get('group_id', '')
320
-    user_id = request.POST.get('user_id', '')
321
-    current_id = int(request.POST.get('current_id', -1))
322
-
323
-    # 群组用户校验
324
-    try:
325
-        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
326
-    except GroupUserInfo.DoesNotExist:
327
-        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
328
-
329
-    curinfo = get_current_photos(group_id, user_id, max(current_id, group_user.current_id), request=request)
330
-
331
-    return response(200, 'Get Flyimg List Success', u'获取飞图上传成功', curinfo)
332
-
333
-
334
-@logit
335
-def flyimg_detail_api(request):
336
-    user_id = request.POST.get('user_id', '')
337
-    photo_id = request.POST.get('photo_id', '')
338
-
339
-    # 群组照片校验
340
-    try:
341
-        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
342
-    except GroupPhotoInfo.DoesNotExist:
343
-        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
344
-
345
-    return response(200, 'Get Flyimg Detail Success', u'获取飞图详情成功', {
346
-        'photo_info': group_photo.photo_info(user_id),
347
-        'comments': get_group_photo_comment_list(photo_id),
348
-        'thumbup': get_group_photo_thumbup_flag(photo_id, user_id),  # user_id 是否点赞 photo_id
349
-        'thumbups': get_group_photo_thumbup_list(photo_id),  # 群组照片点赞列表
350
-    })
351
-
352
-
353
-@logit
354
-def comment_submit_api(request):
355
-    """ 飞图评论提交 """
356
-    group_id = request.POST.get('group_id', '')
357
-    user_id = request.POST.get('user_id', '')
358
-    to_uid = request.POST.get('to_uid', '')
359
-    photo_id = request.POST.get('photo_id', '')
360
-    comment = request.POST.get('comment', '')
361
-
362
-    # 群组用户校验
363
-    try:
364
-        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
365
-    except GroupUserInfo.DoesNotExist:
366
-        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
367
-
368
-    # 群组照片校验
369
-    try:
370
-        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
371
-    except GroupPhotoInfo.DoesNotExist:
372
-        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
373
-
374
-    # 评论内容校验
375
-    if not comment:
376
-        return response(GroupPhotoStatusCode.COMMENT_CONTENT_EMPTY)
377
-
378
-    # 群组照片评论记录创建
379
-    PhotoCommentInfo.objects.create(
380
-        photo_id=photo_id,
381
-        user_id=user_id,
382
-        nickname=group_user.nickname,
383
-        avatar=group_user.avatar,
384
-        to_uid=to_uid,
385
-        comment=comment,
386
-    )
387
-
388
-    # 群组照片评论数更新
389
-    group_photo.comment_num += 1
390
-    group_photo.save()
391
-
392
-    # Redis 群组照片数据缓存
393
-    set_group_photo_data(group_id)
394
-
395
-    # Redis 群组照片评论列表缓存刷新
396
-    set_group_photo_comment_list(photo_id)
397
-
398
-    r.sadd(GROUP_PHOTO_WATCHER_SET % photo_id, user_id)
399
-
400
-    # 判断群组照片发布者是否已经被管理员移除/主动退出,如若移除/退出,则不给发布者提醒
401
-    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
402
-        UserMessageInfo.objects.create(
403
-            from_uid=user_id,
404
-            from_nickname=group_user.nickname,
405
-            from_avatar=group_user.avatar,
406
-            to_uid=group_photo.user_id,
407
-            group_id=group_photo.group_id,
408
-            photo_id=group_photo.photo_id,
409
-            msg_type=UserMessageInfo.COMMENT,
410
-            msg_title=u'评论',
411
-            msg_content=comment,
412
-        )
413
-
414
-    # 给所有关注者(评论/点赞)发送提醒,移除(评论/点赞)者和照片所有者
415
-    watchers = get_group_photo_watchers(photo_id, [user_id, group_photo.user_id])
416
-    for watcher in watchers:
417
-        UserMessageInfo.objects.create(
418
-            from_uid=user_id,
419
-            from_nickname=group_user.nickname,
420
-            from_avatar=group_user.avatar,
421
-            to_uid=watcher,
422
-            group_id=group_photo.group_id,
423
-            photo_id=group_photo.photo_id,
424
-            msg_type=UserMessageInfo.COMMENT,
425
-            msg_title=u'评论',
426
-            msg_content=comment,
427
-        )
428
-
429
-    return response(200, 'Comment Success', u'评论成功', {
430
-        'comments': get_group_photo_comment_list(photo_id),
431
-    })
432
-
433
-
434
-@logit
435
-def comment_list_api(request):
436
-    """ 飞图评论列表 """
437
-    photo_id = request.POST.get('photo_id', '')
438
-
439
-    # 群组照片校验
440
-    if not GroupPhotoInfo.objects.filter(photo_id=photo_id).exists():
441
-        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
442
-
443
-    return response(200, 'Get Comment List Success', u'获取评论列表成功', {
444
-        'comments': get_group_photo_comment_list(photo_id),
445
-    })
446
-
447
-
448
-@logit
449
-def thumbup_submit_api(request):
450
-    """ 飞图点赞提交 """
451
-    group_id = request.POST.get('group_id', '')
452
-    user_id = request.POST.get('user_id', '')
453
-    photo_id = request.POST.get('photo_id', '')
454
-
455
-    # 群组用户校验
456
-    try:
457
-        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
458
-    except GroupUserInfo.DoesNotExist:
459
-        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
460
-
461
-    # 群组照片校验
462
-    try:
463
-        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
464
-    except GroupPhotoInfo.DoesNotExist:
465
-        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
466
-
467
-    # user_id 是否点赞 photo_id
468
-    if get_group_photo_thumbup_flag(photo_id, user_id):
469
-        return response(GroupPhotoStatusCode.DUPLICATE_THUMB_UP)
470
-
471
-    # 群组照片点赞记录创建/更新
472
-    photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
473
-        photo_id=photo_id,
474
-        user_id=user_id,
475
-    )
476
-    photo_thumbup.nickname = group_user.nickname
477
-    photo_thumbup.avatar = group_user.avatar
478
-    photo_thumbup.thumbup = True
479
-    photo_thumbup.save()
480
-
481
-    # Redis 群组照片点赞数据缓存
482
-    set_group_photo_thumbup_flag(photo_id, user_id)
483
-
484
-    # 群组照片点赞数更新
485
-    group_photo.thumbup_num += 1
486
-    group_photo.save()
487
-
488
-    # Redis 群组照片数据缓存
489
-    set_group_photo_data(group_id)
490
-
491
-    # Redis 群组照片点赞列表缓存刷新
492
-    set_group_photo_thumbup_list(photo_id)
493
-
494
-    r.sadd(GROUP_PHOTO_WATCHER_SET % photo_id, user_id)
495
-
496
-    # 判断群组照片发布者是否已经被管理员移除/主动退出,如若移除/退出,则不给发布者提醒
497
-    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
498
-        UserMessageInfo.objects.create(
499
-            from_uid=user_id,
500
-            from_nickname=group_user.nickname,
501
-            from_avatar=group_user.avatar,
502
-            to_uid=group_photo.user_id,
503
-            group_id=group_photo.group_id,
504
-            photo_id=group_photo.photo_id,
505
-            msg_type=UserMessageInfo.THUMBUP,
506
-            msg_title=u'点赞',
507
-            msg_content=u'点赞',
508
-        )
509
-
510
-    # 给所有关注者(评论/点赞)发送提醒,移除(评论/点赞)者和照片所有者
511
-    watchers = get_group_photo_watchers(photo_id, [user_id, group_photo.user_id])
512
-    for watcher in watchers:
513
-        UserMessageInfo.objects.create(
514
-            from_uid=user_id,
515
-            from_nickname=group_user.nickname,
516
-            from_avatar=group_user.avatar,
517
-            to_uid=watcher,
518
-            group_id=group_photo.group_id,
519
-            photo_id=group_photo.photo_id,
520
-            msg_type=UserMessageInfo.THUMBUP,
521
-            msg_title=u'点赞',
522
-            msg_content=u'点赞',
523
-        )
524
-
525
-    return response(200, 'Thumbup Success', u'点赞提交成功', {
526
-        'thumbup': True,
527
-        'thumbups': get_group_photo_thumbup_list(photo_id),
528
-    })
529
-
530
-
531
-@logit
532
-def thumbup_list_api(request):
533
-    """ 飞图点赞列表 """
534
-    user_id = request.POST.get('user_id', '')
535
-    photo_id = request.POST.get('photo_id', '')
536
-
537
-    return response(200, 'Get Thumbup List Success', u'获取点赞列表成功', {
538
-        'thumbup': get_group_photo_thumbup_flag(photo_id, user_id),  # user_id 是否点赞 photo_id
539
-        'thumbups': get_group_photo_thumbup_list(photo_id),  # 群组照片点赞列表
540
-    })
541
-
542
-
543
-@logit
544
-def thumbup_cancel_api(request):
545
-    """ 飞图点赞取消 """
546
-    group_id = request.POST.get('group_id', '')
547
-    user_id = request.POST.get('user_id', '')
548
-    photo_id = request.POST.get('photo_id', '')
549
-
550
-    # 群组用户校验
551
-    try:
552
-        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
553
-    except GroupUserInfo.DoesNotExist:
554
-        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
555
-
556
-    # 群组照片校验
557
-    try:
558
-        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
559
-    except GroupPhotoInfo.DoesNotExist:
560
-        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
561
-
562
-    # user_id 是否点赞 photo_id
563
-    if not get_group_photo_thumbup_flag(photo_id, user_id):
564
-        return response(GroupPhotoStatusCode.THUMB_UP_NOT_FOUND)
565
-
566
-    # 群组照片点赞取消
567
-    photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
568
-        photo_id=photo_id,
569
-        user_id=user_id,
570
-    )
571
-    photo_thumbup.thumbup = False
572
-    photo_thumbup.save()
573
-
574
-    # Redis 群组照片点赞数据移除
575
-    del_group_photo_thumbup_flag(photo_id, user_id)
576
-
577
-    # 群组照片点赞数更新
578
-    group_photo.thumbup_num -= 1
579
-    group_photo.save()
580
-
581
-    # Redis 群组照片数据缓存
582
-    set_group_photo_data(group_id)
583
-
584
-    # Redis 群组照片点赞列表缓存刷新
585
-    set_group_photo_thumbup_list(photo_id)
586
-
587
-    # 判断群组照片发布者是否已经被管理员移除/主动退出,如若移除/退出,则不给发布者提醒
588
-    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
589
-        UserMessageInfo.objects.create(
590
-            from_uid=user_id,
591
-            from_nickname=group_user.nickname,
592
-            from_avatar=group_user.avatar,
593
-            to_uid=group_photo.user_id,
594
-            group_id=group_photo.group_id,
595
-            photo_id=group_photo.photo_id,
596
-            msg_type=UserMessageInfo.THUMBUP,
597
-            msg_title=u'取消点赞',
598
-            msg_content=u'取消点赞',
599
-        )
600
-
601
-    # 群组照片点赞列表
602
-    photo_thumbups = PhotoThumbUpInfo.objects.filter(photo_id=photo_id, thumbup=True, status=True)
603
-
604
-    return response(200, 'Thumbup Cancel Success', u'点赞取消成功', {
605
-        'thumbup': False,
606
-        'thumbups': [thumbup.thumbup_info for thumbup in photo_thumbups],
607
-    })
608
-
609
-
610
-@logit
611
-def pai2_home_api(request):
612
-    """ 首页照片信息 """
613
-    user_id = request.POST.get('user_id', '')
614
-    page = int(request.POST.get('page', 1))
615
-    num = int(request.POST.get('num', settings.PAI2_HOME_PER_PAGE))
616
-
617
-    # 执行原生 SQL 语句,获取首页照片列表
618
-    cursor = connection.cursor()
619
-    cursor.execute((PAI2_HOME_WX_API if request.weixin else PAI2_HOME_API).format(
620
-        user_id=user_id,
621
-        offset=0,
622
-        rows=settings.PAI2_HOME_MAX_ROWS,
623
-    ))
624
-    rows = cursor.fetchall()
625
-
626
-    # 首页照片分页
627
-    rows, left = pagination(rows, page, num)
628
-
629
-    # 首页照片信息
630
-    rows = [{
631
-        'group_id': row[0],
632
-        'group_name': row[1],
633
-        'group_default_avatar': row[2],
634
-        'group_avatar': row[3],
635
-        'group_from': row[4],
636
-        'photo_id': row[5],
637
-        'photo_url': qiniu_file_url(row[6], bucket='watermark' if row[7] else 'photo'),
638
-        'photo_w': row[8],
639
-        'photo_h': row[9],
640
-        'photo_thumbnail_url': qiniu_file_url(row[10], bucket='thumbnail'),
641
-        'photo_thumbnail_w': row[11],
642
-        'photo_thumbnail_h': row[12],
643
-        'photo_thumbnail2_url': qiniu_file_url(row[13], bucket='thumbnail2'),
644
-        'photo_thumbnail2_w': row[14],
645
-        'photo_thumbnail2_h': row[15],
646
-        'photo_share_url': share_url(row[5]),  # Warning: Index of This Line is 5
647
-        'user_id': row[16],
648
-        'nickname': row[17],
649
-        'avatar': row[18],
650
-        'comment_num': row[19],
651
-        'thumbup_num': row[20],
652
-        'photo_from': row[21],
653
-        'session_id': row[22],
654
-        'nomark': row[23],
655
-        'origin': row[24],
656
-        'created_at': row[25],
657
-        'origin_expired_stamps': origin_expired_stamps(row[25], row[16]),
658
-        'thumbup': get_group_photo_thumbup_flag(row[5], user_id),
659
-        'porder': get_lensman_order_record(row[5], user_id) if row[21] == GroupPhotoInfo.SESSION_GROUP else {},
660
-        'display_payment_btn': row[21] == GroupPhotoInfo.SESSION_GROUP and row[26] not in [GroupPhotoInfo.OUTTAKE],
661
-    } for row in rows]
662
-
663
-    return response(200, 'Get Home Data Success', u'获取首页数据成功', {
664
-        'photos': rows,
665
-        'left': left,
666
-    })
667
-
668
-
669
-@logit
670
-def lensman_photo_price(request):
671
-    """ 摄影师照片价格获取 """
672
-    user_id = request.POST.get('user_id', '')
673
-    photo_id = request.POST.get('photo_id', '')
674
-    photo_type = request.POST.get('photo_type', 'nomark')  # nomark for 去除水印, origin for 获取高清图
675
-
676
-    # 群组照片校验
677
-    try:
678
-        group_photo = GroupPhotoInfo.objects.get(photo_id=photo_id)
679
-    except GroupPhotoInfo.DoesNotExist:
680
-        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
681
-
682
-    return response(200, 'Get Price Success', u'获取价格成功', {
683
-        'price': get_group_photo_price(group_photo, photo_type)
684
-    })
685
-
686
-
687
-@logit
688
-def lensman_photo_bought(request):
689
-    """ 摄影师照片已购买 """
690
-    user_id = request.POST.get('user_id', '')
691
-    photo_id = request.POST.get('photo_id', '')
692
-
693
-    return response(200, 'Get Bought Data Success', u'获取购买数据成功', {
694
-        'porder': get_lensman_order_record(photo_id, user_id)
695
-    })
696
-
697
-
698
-class GroupInfoViewSet(viewsets.ModelViewSet):
699
-    queryset = GroupInfo.objects.all().order_by('-pk')
700
-    serializer_class = GroupInfoSerializer
701
-
702
-
703
-class GroupUserInfoViewSet(viewsets.ModelViewSet):
704
-    queryset = GroupUserInfo.objects.all().order_by('-pk')
705
-    serializer_class = GroupUserInfoSerializer
706
-
707
-
708
-class GroupPhotoInfoViewSet(viewsets.ModelViewSet):
709
-    queryset = GroupPhotoInfo.objects.all().order_by('-pk')
710
-    serializer_class = GroupPhotoInfoSerializer
7
+# Create your views here.

+ 1 - 1
pai2/settings.py

@@ -44,7 +44,7 @@ INSTALLED_APPS = (
44 44
     'django.contrib.messages',
45 45
     'django.contrib.staticfiles',
46 46
     'rest_framework',
47
-    'django_q',
47
+    # 'django_q',
48 48
     'django_rlog',
49 49
     'django_uniapi',
50 50
     'django_we',

+ 1 - 2
pai2/urls.py

@@ -22,8 +22,7 @@ from django.contrib import admin
22 22
 from rest_framework import routers
23 23
 
24 24
 from account import views as account_views
25
-from group import views as group_views
26
-from group import grouppage_views
25
+from group import group_views, grouppage_views
27 26
 from miniapp import views as mini_views
28 27
 from photo import views as photo_views
29 28
 from website import views as website_views

+ 1 - 1
photo/admin.py

@@ -20,6 +20,6 @@ class PhotosInfoAdmin(admin.ModelAdmin):
20 20
     list_filter = ('lensman_id', 'status')
21 21
 
22 22
 
23
-admin.site.register(UUIDInfo, UUIDInfoAdmin)
23
+# admin.site.register(UUIDInfo, UUIDInfoAdmin)
24 24
 admin.site.register(PhotosInfo, PhotosInfoAdmin)
25 25
 admin.site.register(PhotoUUIDInfo, PhotoUUIDInfoAdmin)

+ 8 - 8
photo/views.py

@@ -3,7 +3,7 @@
3 3
 from curtail_uuid import CurtailUUID
4 4
 from django.db import transaction
5 5
 from django.shortcuts import render
6
-from django_q.tasks import async
6
+# from django_q.tasks import async
7 7
 from django_response import response
8 8
 from ipaddr import client_ip
9 9
 from logit import logit
@@ -46,13 +46,13 @@ def uuid(request):
46 46
     # 从 Redis 中 Pop 中指定数量的 UUID
47 47
     uuids, succeed, left = r.multi_pop(UUID_LIST, num)
48 48
 
49
-    # 异步更新 UUID 数据库中状态
50
-    if uuids:
51
-        async(update_uuids, lensman_id, uuids)
52
-
53
-    # 当可用 UUID 数量少于 500 时, 异步创建
54
-    if left < 500:
55
-        async(generate_uuids)
49
+    # # 异步更新 UUID 数据库中状态
50
+    # if uuids:
51
+    #     async(update_uuids, lensman_id, uuids)
52
+    #
53
+    # # 当可用 UUID 数量少于 500 时, 异步创建
54
+    # if left < 500:
55
+    #     async(generate_uuids)
56 56
 
57 57
     return response(200, 'Get UUID Success', u'获取唯一标识成功', uuids)
58 58
 

+ 0 - 1
requirements.txt

@@ -1,4 +1,3 @@
1
--e git+https://github.com/Brightcells/django-q.git#egg=django-q
2 1
 CodeConvert==2.0.4
3 2
 Django==1.11.9
4 3
 MySQL-python==1.2.5